﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


using Modelo_ETdA.Negocio.Analise;
using Modelo_ETdA.Negocio.Analise.Formato;
using Modelo_ETdA.Negocio.Analise.Avaliacao;
using Modelo_ETdA.Negocio.AmbienteComercial;

namespace Modelo_ETdA.Interface
{
    public partial class RegistarAvaliacaoProfissional : Form
    {
        private DataTable tabela = new DataTable();
        private GestorAnalise gAnalise;
        private FormatoAvaliacaoProfissional form_pro;
        private List<Consideracao> consideracoes;
        private List<FormularioAvaliacao> l_fa;
        private MenuAnaliseETdA anterior;

        public RegistarAvaliacaoProfissional(MenuAnaliseETdA anterior, GestorAnalise gestor, FormatoAvaliacao formato, List<FormularioAvaliacao> listaFormularios)
        {
            InitializeComponent();
            this.anterior = anterior;
            this.gAnalise = gestor;
            this.form_pro = (FormatoAvaliacaoProfissional)formato;
            if (listaFormularios == null)
            {
                this.l_fa = new List<FormularioAvaliacao>();
            }
            else
            {
                this.l_fa = listaFormularios;
                nomeAval.Text = listaFormularios[listaFormularios.Count - 1].Doc_cabecalho.Nome;
            }
            nomeFormato.Text = form_pro.Doc_cabecalho.Nome;
            preencheListaDivisoes();

            consideracoes = gAnalise.consultaListaConsideracao();
            tabela.Columns.Add("cod");
            tabela.Columns["cod"].ReadOnly = true;
            tabela.Columns.Add("Consideração");
            tabela.Columns["Consideração"].ReadOnly = true;
            tabela.Columns.Add("Avaliação");
            tabela.Columns.Add("Mínimo Escala");
            tabela.Columns["Mínimo Escala"].ReadOnly = true;
            tabela.Columns.Add("Máximo Escala");
            tabela.Columns["Máximo Escala"].ReadOnly = true;

            inicializaTabela();

            tabelaCons.DataSource = tabela;
            tabelaCons.Columns["cod"].Visible = false;
            tabelaCons.Columns["Consideração"].Width += 100;
            tabelaCons.Columns["Avaliação"].Width += 10;
            tabelaCons.Columns["Mínimo Escala"].Width += 10;
            tabelaCons.Columns["Máximo Escala"].Width += 10;
        }
        private void inicializaTabela()
        {
            DataRow workRow;
            tabela.Clear();
            foreach (Consideracao cons in consideracoes)
            {
                workRow = tabela.NewRow();
                workRow["cod"] = form_pro.MapConsideracaoQuestao[cons.Cod].CodConsideracao;
                workRow["Consideração"] = cons.Descricao;
                workRow["Avaliação"] = 0;
                workRow["Mínimo Escala"] = form_pro.MapConsideracaoQuestao[cons.Cod].EscalaMin;
                workRow["Máximo Escala"] = form_pro.MapConsideracaoQuestao[cons.Cod].EscalaMax;
                tabela.Rows.Add(workRow);
            }
        }

        private void preencheListaDivisoes()
        {
            List<Divisao> lista = gAnalise.AmbComercialSessao.listDivisao;
            int i = 0; //lista.Count - 1;
            while (i < lista.Count)
            {
                cDiv.Items.Add(lista[i].Descricao);
                i++;
            }
            cDiv.SelectedIndex = 0;
        }

        private void guardar_Click(object sender, EventArgs e)
        {
            try{
            if (validaDados() == 1) return;
            actualizaListaForms();
            int insereCod = gAnalise.registListFormAval(l_fa);
            if (insereCod == 0)
            {
                MessageBox.Show("Avaliação inserida com sucesso!", "Sucesso", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Visible = false;
                anterior.Visible = true;
            }
            else if (insereCod == 2)
            {
                MessageBox.Show("Já existe uma Avaliação Registada com o mesmo nome!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                MessageBox.Show("Avaliação inserida SEM sucesso!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            }
            catch (Exception exp)
            {
                MessageBox.Show("Erro ao guardar avaliação!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void actualizaListaForms()
        {

            string nome_div = cDiv.Text;
            DataRow workRow;
            List<Resposta> listaResps = new List<Resposta>();
            for (int i = 0; i < tabela.Rows.Count; i++)
            {
                workRow = tabela.Rows[i];
                int codCons = Convert.ToInt32(workRow["cod"]);
                int codBD = form_pro.MapConsideracaoQuestao[codCons].CodBD;
                int aval = Convert.ToInt32(workRow["Avaliação"]);
                Resposta resp = new Resposta(-1, codBD, aval);
                listaResps.Add(resp);
            }
            DocumentoCabecalho cab = new DocumentoCabecalho(nomeAval.Text, "Cliente", new DateTime(), 2);
            FormularioAvaliacao fa = new FormularioAvaliacao(form_pro.getCod(), cab, gAnalise.AmbComercialSessao.Cabeçalho.Cod, getCodDiv(nome_div));
            fa.Respostas = listaResps;
            l_fa.Add(fa);
        }

        private void novoFormulario_Click(object sender, EventArgs e)
        {
            try
            {
                if (validaDados() == 1) return;
                actualizaListaForms();
                inicializaTabela();
            }
            catch (Exception exp)
            {
                MessageBox.Show("Erro ao carregar novo avaliação!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private int getCodDiv(String desc)
        {
            List<Divisao> lista = gAnalise.AmbComercialSessao.listDivisao;
            int ret = -1;
            foreach (Divisao div in lista)
            {
                if (div.Descricao.CompareTo(desc) == 0)
                {
                    ret = div.CodRelativo;
                    break;
                }
            }
            return ret;
        }

        public int validaDados()
        {
            int i = 0;
            if (nomeAval.TextLength == 0)
            {
                MessageBox.Show("Não preencheu o nome da Avaliação!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return 1;
            }
            try
            {
                while (i < consideracoes.Count)
                {
                    int ava = Convert.ToInt32(tabela.Rows[i][2]);
                    int min = Convert.ToInt32(tabela.Rows[i][3]);
                    int max = Convert.ToInt32(tabela.Rows[i][4]);
                    if (ava < min || ava > max)
                    {
                        MessageBox.Show("Possuiu campos em que o valor dado é inválido!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return 1;
                    }
                    i++;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não preencheu todos os valores!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return 1;
            }
            return 0;
        }

        private void RegistarAvaliacaoProfissional_Load(object sender, EventArgs e)
        {
        }

        private void voltar_Click(object sender, EventArgs e)
        {
            anterior.Visible = true;
            this.Visible = false;
        }

        private void RegistarAvaliacaoProfissional_FormClosed(object sender, FormClosedEventArgs e)
        {
            anterior.sair();
        }
    }
}
